package com.edais.util.random;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class LotteryUtil {

	/**
     * 抽奖算法
     * 
     * @param orignalRates
     *            原始的概率列表，保证顺序和实际物品对应
     * @return
     *         物品的索引
     */
	 public static int lottery(List<BigDecimal> orignalRates) {
	        if (orignalRates == null || orignalRates.isEmpty()) {
	            return -1;
	        }
	 
	        int size = orignalRates.size();
	 
	        // 计算总概率，这样可以保证不一定总概率是1
	        BigDecimal sumRate = new BigDecimal("0.0");
	        for (BigDecimal rate : orignalRates) {
	        	sumRate = sumRate.add(rate);
	        }
	 
	        // 计算每个物品在总概率的基础下的概率情况
	        List<BigDecimal> sortOrignalRates = new ArrayList<BigDecimal>(size);
	        BigDecimal tempSumRate = new BigDecimal("0.0");
	        for (BigDecimal rate : orignalRates) {
	        	tempSumRate = tempSumRate.add(rate);
	            sortOrignalRates.add(tempSumRate.divide(sumRate));
	        }
	 
	        // 根据区块值来获取抽取到的物品索引
	        BigDecimal nextDouble = new BigDecimal(String.valueOf(Math.random()));
	        sortOrignalRates.add(nextDouble);
	        Collections.sort(sortOrignalRates);
	 
	        return sortOrignalRates.indexOf(nextDouble);
	    }
}
